﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI
{
    using BLL;
    using DAL;
    using DAL.Models;
    using QldtSdh.Utils;
    using QldtSdh.GUI.Utils;

    public partial class UcInThoiKhoaBieu_GiangVien : QldtSdh.GUI.Common.BaseUserControl, QldtSdh.GUI.Common.IHocKyChangable
    {
        private bool _DoNotLoadGiangVienList = false;
        private bool _DoNotLoadChiTietGiangVien = false;

        public UcInThoiKhoaBieu_GiangVien()
        {
            InitializeComponent();

            gridGiangVien.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: false);
            gridGiangVien.AddRowIndexing();
            gridThoiKhoaBieu.SetDataGridViewAsReadonly(rowHeadersVisible: false, columnHeadersVisible: true);
        }

        /// <summary>
        /// Học kỳ chứa danh sách các Lớp học phần
        /// </summary>
        public DAL.Models.HocKy HocKy { get; private set; }

        internal void SetHocKy(DAL.Models.HocKy hocKy)
        {
            // Thiết lập học kỳ chứa danh sách các Lớp học phần
            // -> 
            this.HocKy = hocKy;

            this._DoNotLoadGiangVienList = true;
            try
            {
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    // Nạp danh sách các đơn vị phụ trách chuyên môn
                    var lstDonVi = BizDaoTao.GetListDonViDaoTaoTrongHocKy(hocKy, db);

                    bsDonViPhuTrach.DataSource = lstDonVi;
                    cbxDonViPhuTrach.DisplayMember = "TenDonVi";
                    cbxDonViPhuTrach.DataSource = bsDonViPhuTrach;
                }
            }
            finally
            {
                this._DoNotLoadGiangVienList = false;
            }

            UpdateGuiBySelectedDonViPhuTrach();
        }

        public void ChangeHocKy(DAL.Models.HocKy newHocKy)
        {
            if (newHocKy != this.HocKy)
                this.SetHocKy(newHocKy);
        }

        /// <summary>
        /// Đơn vị đang được chọn trên giao diện
        /// </summary>
        private DonVi SelectedDonVi
        {
            get
            {
                DonVi donVi = null;
                if (bsDonViPhuTrach.Current != null)
                    donVi = bsDonViPhuTrach.Current as DonVi;
                return donVi;
            }
        }

        private GiangVien SelectedGiangVien
        {
            get
            {
                if (bsGiangVien.Current != null)
                    return bsGiangVien.Current as GiangVien;
                return null;
            }
        }

        /// <summary>
        /// Nạp danh sách giảng viên thuộc đơn vị phụ trách "SelectedDonViPhuTrach", có tham gia giảng dạy trong học kỳ "HocKy".
        /// </summary>
        public void NapDanhSachGiangVien()
        {
            this._DoNotLoadChiTietGiangVien = true;
            try
            {
                var hocKy = this.HocKy;
                var donVi = this.SelectedDonVi;
                if (donVi == null)
                    bsGiangVien.DataSource = null;
                else
                    bsGiangVien.DataSource = BizGiangVien.GetListGiangVien(cuaDonVi: donVi, thamGiaDaoTaoTrongHocKy: hocKy);
                gridGiangVien.SetDataSource(bsGiangVien);
            }
            finally
            {
                this._DoNotLoadChiTietGiangVien = false;
            }

            HienThiThongTinThongKe();
            UpdateGuiBySelectedGiangVien();
        }

        private void HienThiThongTinThongKe()
        {
            if (bsGiangVien.Count == 0)
                lblThongKeSoGiangVien.Text = "Không có giảng viên nào";
            else
                lblThongKeSoGiangVien.Text = string.Format("Có {0} giảng viên", bsGiangVien.Count);
        }

        private void UpdateGuiBySelectedGiangVien()
        {
            var selectedDonVi = this.SelectedDonVi;
            var giangVien = this.SelectedGiangVien;
            if (HocKy == null || giangVien == null || selectedDonVi == null)
            {
                lblSelectedGiangVien_Details.Text = "";
                bsThoiKhoaBieu.DataSource = null;
            }
            else
            {
                lblSelectedGiangVien_Details.Text = string.Format("Thời khoá biểu của {0} trong {1}",
                    giangVien.GiangVienDescTKB, HocKy.TenHocKyDayDu);
                bsThoiKhoaBieu.DataSource = BizThoiKhoaBieu.GetThoiKhoaBieuCacLHP(cuaGiangVien: giangVien, trongHocKy: HocKy);
                gridThoiKhoaBieu.SetDataSource(bsThoiKhoaBieu);
            }

            HienThiThongTinThongKeTKB();
        }

        private void HienThiThongTinThongKeTKB()
        {
            if (bsThoiKhoaBieu.Count == 0)
                lblThongKeThoiKhoaBieu.Text = "Chưa có thông tin Thời khoá biểu";
            else
            {
                var lst = bsThoiKhoaBieu.DataSource as List<ThoiKhoaBieuForPrint>;
                if (lst != null)
                {
                    for (int i = lst.Count - 1; i >= 0; i--)
                        if (string.IsNullOrEmpty(lst[i].STT) == false)
                        {
                            //var num = Convert.ToInt32(lst[i].STT);
                            lblThongKeThoiKhoaBieu.Text = string.Format("Có {0} Lớp học phần", lst[i].STT);
                            return;
                        }
                }
                lblThongKeThoiKhoaBieu.Text = "";
            }
        }

        private void bsDonViPhuTrach_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadGiangVienList)
                return;
            UpdateGuiBySelectedDonViPhuTrach();
        }

        private void UpdateGuiBySelectedDonViPhuTrach()
        {
            btnInThoiKhoaBieuGiangVien.Enabled = this.SelectedDonVi != null;
            NapDanhSachGiangVien();
        }

        private void bsGiangVien_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadChiTietGiangVien)
                return;
            UpdateGuiBySelectedGiangVien();
        }

        private void btnInThoiKhoaBieuGiangVien_Click(object sender, EventArgs e)
        {
            var frm = new DaoTao.FormInThoiKhoaBieuGiangVien();
            var pHocKyNamHocString = this.HocKy.TenHocKyDayDu;
            var pGiangVien = this.SelectedGiangVien.GiangVienDescTKB;
            var pDonViPhuTrach = this.SelectedDonVi.TenDonVi;
            var pChucDanhKy = "P. TRƯỞNG PHÒNG ĐTSĐH";
            var pHoTenChucDanhKy =
                //BizConfig.GetConfig()["phophong"].ToUpper();
                BizAppConfig.GetPhoTruongPhong();
            frm.LoadData(bsThoiKhoaBieu.DataSource as IList<ThoiKhoaBieuForPrint>, pGiangVien, pDonViPhuTrach, pHocKyNamHocString, pChucDanhKy, pHoTenChucDanhKy);
            frm.ShowDialog();
        }

        private void btnInThoiKhoaBieuGiangVien_DonVi_Click(object sender, EventArgs e)
        {
            var frm = new DaoTao.FormInThoiKhoaBieuGiangVien_Batch(SelectedDonVi, bsGiangVien.DataSource as List<GiangVien>, HocKy);
            frm.ShowDialog();
        }
    }
}
